#include "head.h"

// 判断输入指令是否合法
int isLegal(char *token){
    for(int i = 0; i < instructCount; i++){
        if(strcmp(token, instructSet[i]) == 0){
            return 1;
        }
    }    
    return 0;
}

// 清空缓冲区
void clear_input_buffer() {
    int c;
    while ((c = getchar()) != '\n' && c != EOF) {
        // 丢弃缓冲区中的字符
    }
}

// 功能：填充参数字段
int fillArgs(bool *args, char *str){
    if(str == NULL){
        return 1;
    }
    if(!strcmp(str, "-a")){
        args[0] = 1;
        return 0;
    }
    
    if(!strcmp(str, "-l")){
        args[1] = 1;
        return 0;
    }

    if(!strcmp(str, "-i")){
        args[2] = 1;
        return 0;
    }
    return -1;
}

// 功能：处理指令
int dealInstruction(char *instruct, int sockfd){
    // 分割
    char *token = strtok(instruct, " \n");
    if(!isLegal(token)){
        printf("指令输入错误\n");
        return 0;
    }

    char *path1 = strtok(NULL, " \n");
    char *path2 = strtok(NULL, " \n");
    char *path3 = strtok(NULL, " \n");
    char *path4 = strtok(NULL, " \n");
    

    printf("instruct : --%s--\n", token);
    printf("path1: --%s--\n", path1);
    printf("path2: --%s--\n", path2);


    // 单指令处理
    if(!strcmp(token, "pwd") ){

        TLVRequest(sockfd, NULL, PWD);

    } else if(!strcmp(token, "cd") || !strcmp(token, "mkdir")){
        // 双指令处理
        if(path1 == NULL || path1[0] == '-'){
            printf("指令参数错误\n");
            return 0;
        }
        if(!strcmp(token, "cd")){
            TLVRequest(sockfd, path1, CD);
        }else if(!strcmp(token, "mkdir")){
            TLVRequest(sockfd, path1, MKDIR);
        }
        // ls单独处理
    }else if(!strcmp(token, "ls")){
        // 看是否有参数
        bool args[4];
        bzero(args, sizeof(args));

        // 参数填充
        if(fillArgs(args, path1) == 0){
            if(fillArgs(args, path2) == 0){
                if(fillArgs(args, path3) == 0){
                    if(path4 == NULL){
                        TLVRequestSign(sockfd, NULL, LS, args);
                    }else{
                        TLVRequestSign(sockfd, path4, LS, args);
                    }
                }else{
                    if(path3 == NULL){
                        TLVRequestSign(sockfd, NULL, LS, args);
                    }else{
                        TLVRequestSign(sockfd, path3, LS, args);
                    }
                }
            }else{
                if(path2 == NULL){
                    TLVRequestSign(sockfd, NULL, LS, args);
                }else{
                    TLVRequestSign(sockfd, path2, LS, args);
                }
            }
        }else{
            if(path1 == NULL){
                TLVRequest(sockfd, NULL, LS);
            }else{
                TLVRequest(sockfd, path1, LS);
            }
        }
    }else if(!strcmp(token, "rmdir")){
        // rmdir 可能带参数，单独处理
        bool args[4] = {0};
        if(path1[0] == '-'){
            if(!strcmp(path1, "-r")){
                args[0] = 1;
                if(path2 == NULL){
                    printf("参数错误\n");
                    return 1;
                }else{
                    TLVRequestSign(sockfd, path2, RMDIR, args);
                }
            }else{
                printf("参数错误\n");
                return 1;
            }
        }
        // 不带参数
        if(path1 == NULL){
            printf("参数错误\n");
            return 1;
        }
        TLVRequest(sockfd, path1, RMDIR);
    }
    else{
        // 三指令处理
        if(path1 == NULL || path2 == NULL){
            printf("指令参数错误\n");
            return -1;
        }

        if(!strcmp(token, "puts")){

            // 上传不存在的文件
            if(strcmp(token, "puts") == 0 && access(path1, F_OK) != 0){
                perror("puts");
                return -1;
            }

            // 上传文件，处理服务端响应
            putsFile(path1, path2, sockfd);
        }else{

            // 下载文件，以及处理服务段响应
            getsFile(path1, path2, sockfd);
        }
        return 0;
    }

    // 获取服务端的响应
    recvResponse(sockfd);

    return 0;
}

//int main(){
//    char buf[256] = {0};
//    read(STDIN_FILENO, buf, sizeof(buf));
//    dealInstruction(buf);
//}
